#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/watchdog.h>

#define WDT_ON  "1"
#define WDT_OFF "0"

#define WDT_FEED_MAX 30

int enable_watchdog(void)
{
    FILE *wdt_en_fp; //wdt enable pin
    char file_name_str[256];

	sprintf(file_name_str,"/ual/wdt_en/value");
	if ((wdt_en_fp = fopen(file_name_str, "rb+")) == NULL)
	{
        fprintf(stderr, "打开看门狗使能设备失败，路径:%s\n", file_name_str);
		return 1;
	}
	fprintf(wdt_en_fp, WDT_ON);
	fclose(wdt_en_fp);
    printf("打开看门狗使能设备成功, 路径:%s\n", file_name_str);
	return 0;
}

int main(void)
{
	/*喂狗余下还需喂狗次数*/
    int  wdt_feed_left = WDT_FEED_MAX;

	/*已经喂狗测试计数用于判定拉高拉低*/
    int  wdt_feed_cnt = 0;

	/*喂狗设备文件指针*/
    FILE *wdt_feed_fp; 

    char file_name_str[256];

	sprintf(file_name_str,"/ual/ledrun/value");

	if ((wdt_feed_fp = fopen(file_name_str, "rb+")) == NULL)
	{
        fprintf(stderr, "打开喂狗设备失败，路径: %s\n", file_name_str);
		goto failed_end;
	}
    printf("打开喂狗设备成功, 路径:%s\n", file_name_str);

    while (1) 
	{
        if(wdt_feed_left > 0)
        {

			if( 0 == (WDT_FEED_MAX-wdt_feed_left))
			{
				/*第一次需要拉高拉低初始化一下喂狗引脚*/
				/*喂狗流程实际上时拉高拉低产生方波*/
				/*拉高*/
	            fprintf(wdt_feed_fp, "1");
	            fflush(wdt_feed_fp);
        		usleep(100000);
				/*拉低*/
        	    fprintf(wdt_feed_fp, "0");
	            fflush(wdt_feed_fp);
        		usleep(100000);
	            wdt_feed_cnt = 0;
				printf("初始化喂狗设备完毕\n");
        		usleep(100000);
			   /*使能看门狗*/
               if(0 != enable_watchdog())
			   {
				   goto failed_end;
			   }
            }else
			{
	            printf("正在喂狗, 已喂狗次数:%02d , 还需喂狗次数:%02d\n", (WDT_FEED_MAX-wdt_feed_left), wdt_feed_left);
				/*喂狗流程实际上时拉高拉低产生方波*/
    	        if( 0 == wdt_feed_cnt)
				{
					/*拉高*/
                	fprintf(wdt_feed_fp, "1");
	                wdt_feed_cnt = 1;
    	        }else
        	    {
					/*拉低*/
                	fprintf(wdt_feed_fp, "0");
	                wdt_feed_cnt = 0;
	            }
    	        fflush(wdt_feed_fp);
			}
			wdt_feed_left--;
        }else{
            printf("停止喂狗，喂狗次数已达到上限: %d\n", WDT_FEED_MAX);
            printf("系统将很快重启, 请稍等!\n");
            fclose(wdt_feed_fp);
            sleep(10);
			goto finish_end;
        }
        usleep(100000);
    }
finish_end:
	if(wdt_feed_fp != NULL)
	{
    	fclose(wdt_feed_fp);
		wdt_feed_fp = NULL;
	}
    return 0;

failed_end:
	if(wdt_feed_fp != NULL)
	{
    	fclose(wdt_feed_fp);
		wdt_feed_fp = NULL;
	}
	return 1;
}
